/**   
* @Title: LogicExceptionAspect.java 
* @Package com.gomeplus.frame.aop 
* @Description: 业务层异常抓取切面类
* @author chenmin-ds   
* @date 2017年5月25日 下午6:02:37 
* @company cn.com.gome
* @version V1.0   
*/ 


package com.gomeplus.frame.aop;

import com.gomeplus.frame.exception.LogicsException;
import com.google.common.base.Throwables;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import java.lang.reflect.Method;

/** 
 * @ClassName: LogicExceptionAspect 
 * @Description: 业务层异常抓取切面类
 * @author chenmin-ds 
 * @date 2017年5月25日 下午6:02:37  
 */
@Aspect
@Component
public class LogicExceptionAspect {

	private Logger logger = LoggerFactory.getLogger("LogicExceptionAspect");
	
	@AfterThrowing(throwing="e",pointcut = "execution(* com.gomeplus.*.logic.impl.*.exec(..))")
	public void doException(JoinPoint pjp,Exception e)throws Throwable{
		
		// 拦截的实体类
		Object target = pjp.getTarget();
		// 拦截的方法名称
		String methodName = pjp.getSignature().getName();
		// 拦截的放参数类型
		@SuppressWarnings("rawtypes")
		Class[] parameterTypes = ((MethodSignature) pjp.getSignature()).getMethod().getParameterTypes();

		// 获得被拦截的方法
		Method method = target.getClass().getMethod(methodName, parameterTypes);
		
		if (null != method) {
			
			if(method.isAnnotationPresent(LogicExceptionAop.class)){
				
				// 获取自定义注解实体
				LogicExceptionAop logicExceptionAop = method.getAnnotation(LogicExceptionAop.class);
				if(!(e instanceof LogicsException)){
					logger.error("业务节点类名： {}, 业务节点作用：{}, 预错误描述信息： {}，异常信息：{}",
							logicExceptionAop.className(),
							logicExceptionAop.logicFunction(),
							logicExceptionAop.errorInfo(),
							Throwables.getStackTraceAsString(e));
					throw new LogicsException("0101",logicExceptionAop.errorInfo());
				}
				
			}
			
		}
    }
}
